/**获取农历 start*/
function getLunar(date) {
	let returnVal;
	var nyear;
	var nmonth;
	var nday = -1;
	var nwday;
	var nhrs;
	var nmin;
	var nsec;

	var lmonth, lday, lleap; //农历参数

	function Draw() {
		NewTick();

		//显示时间
		var s = nyear + '年' + nmonth + '月' + nday + '日 ' + '星期' + cweekday(nwday) + ' ' + shapetime(nhrs, nmin, nsec);
		s += " 农历" + lmonth + "月" + lday; //农历
		var lunar_month_day = lmonth + "月" + lday;
		//需要展示在页面地方
		returnVal = (lunar_month_day);
	}


	function NewTick() {
		noww = new Date(date);
		if (noww.getDate() != nday) {
			nyear = noww.getFullYear();
			nmonth = noww.getMonth() + 1;
			nwday = noww.getDay();
			nday = noww.getDate();

			getlunar(); //获取农历
		}
		nhrs = noww.getHours();
		nmin = noww.getMinutes();
		nsec = noww.getSeconds();
	}


	//辅助函数
	var hzWeek = new Array("日", "一", "二", "三", "四", "五", "六", "日");
	function cweekday(wday) {
		return hzWeek[wday];
	}
	function shapetime(vhrs, vmin, vsec) {
		if (vsec <= 9) vsec = "0" + vsec;
		if (vmin <= 9) vmin = "0" + vmin;
		if (vhrs <= 9) vhrs = "0" + vhrs;
		return vhrs + ":" + vmin + ":" + vsec
	}

	//农历函数开始
	var lunarInfo = new Array(0x04bd8, 0x04ae0, 0x0a570, 0x054d5, 0x0d260, 0x0d950, 0x16554, 0x056a0, 0x09ad0, 0x055d2, 0x04ae0, 0x0a5b6, 0x0a4d0, 0x0d250, 0x1d255, 0x0b540, 0x0d6a0, 0x0ada2, 0x095b0, 0x14977, 0x04970, 0x0a4b0, 0x0b4b5, 0x06a50, 0x06d40, 0x1ab54, 0x02b60, 0x09570, 0x052f2, 0x04970, 0x06566, 0x0d4a0, 0x0ea50, 0x06e95, 0x05ad0, 0x02b60, 0x186e3, 0x092e0, 0x1c8d7, 0x0c950, 0x0d4a0, 0x1d8a6, 0x0b550, 0x056a0, 0x1a5b4, 0x025d0, 0x092d0, 0x0d2b2, 0x0a950, 0x0b557, 0x06ca0, 0x0b550, 0x15355, 0x04da0, 0x0a5b0, 0x14573, 0x052b0, 0x0a9a8, 0x0e950, 0x06aa0, 0x0aea6, 0x0ab50, 0x04b60, 0x0aae4, 0x0a570, 0x05260, 0x0f263, 0x0d950, 0x05b57, 0x056a0, 0x096d0, 0x04dd5, 0x04ad0, 0x0a4d0, 0x0d4d4, 0x0d250, 0x0d558, 0x0b540, 0x0b6a0, 0x195a6, 0x095b0, 0x049b0, 0x0a974, 0x0a4b0, 0x0b27a, 0x06a50, 0x06d40, 0x0af46, 0x0ab60, 0x09570, 0x04af5, 0x04970, 0x064b0, 0x074a3, 0x0ea50, 0x06b58, 0x05ac0, 0x0ab60, 0x096d5, 0x092e0, //1990
		0x0c960, 0x0d954, 0x0d4a0, 0x0da50, 0x07552, 0x056a0, 0x0abb7, 0x025d0, 0x092d0, 0x0cab5, 0x0a950, 0x0b4a0, 0x0baa4, 0x0ad50, 0x055d9, 0x04ba0, 0x0a5b0, 0x15176, 0x052b0, 0x0a930, 0x07954, 0x06aa0, 0x0ad50, 0x05b52, 0x04b60, 0x0a6e6, 0x0a4e0, 0x0d260, 0x0ea65, 0x0d530, 0x05aa0, 0x076a3, 0x096d0, 0x04bd7, 0x04ad0, 0x0a4d0, 0x1d0b6, 0x0d250, 0x0d520, 0x0dd45, 0x0b5a0, 0x056d0, 0x055b2, 0x049b0, 0x0a577, 0x0a4b0, 0x0aa50, 0x1b255, 0x06d20, 0x0ada0, 0x14b63);
	function lYearDays(y) {
		var i, sum = 348;
		for (i = 0x8000; i > 0x8; i >>= 1) sum += (lunarInfo[y - 1900] & i) ? 1 : 0;
		return (sum + leapDays(y));
	}
	function leapDays(y) {
		if (leapMonth(y)) return ((lunarInfo[y - 1900] & 0x10000) ? 30 : 29);
		else return (0);
	}
	function leapMonth(y) {
		return (lunarInfo[y - 1900] & 0xf);
	}
	function monthDays(y, m) {
		return ((lunarInfo[y - 1900] & (0x10000 >> m)) ? 30 : 29);
	}
	function Lunar(y, m, d) {
		var i, leap = 0,
			temp = 0;
		var offset = (Date.UTC(y, m, d) - Date.UTC(1900, 0, 31)) / 86400000;
		for (i = 1900; i < 2050 && offset > 0; i++) {
			temp = lYearDays(i);
			offset -= temp;
		}
		if (offset < 0) {
			offset += temp;
			i--;
		}
		this.year = i;
		leap = leapMonth(i);
		this.isLeap = false;
		for (i = 1; i < 13 && offset > 0; i++) {
			if (leap > 0 && i == (leap + 1) && this.isLeap == false) {
				--i;
				this.isLeap = true;
				temp = leapDays(this.year);
			} else {
				temp = monthDays(this.year, i);
			}
			if (this.isLeap == true && i == (leap + 1)) this.isLeap = false;
			offset -= temp;
		}
		if (offset == 0 && leap > 0 && i == leap + 1) if (this.isLeap) {
			this.isLeap = false;
		} else {
			this.isLeap = true; --i;
		}
		if (offset < 0) {
			offset += temp; --i;
		}
		this.month = i;
		this.day = offset + 1;
	}
	var nStr1 = new Array('', '一', '二', '三', '四', '五', '六', '七', '八', '九', '十', '十一', '十二');
	var nStr2 = new Array('初', '十', '廿', '卅', '□');
	function GetcDay(d) {
		var s;
		switch (d) {
			case 10:
				s = '初十';
				break;
			case 20:
				s = '二十';
				break;
			case 30:
				s = '三十';
				break;
			default:
				s = nStr2[Math.floor(d / 10)];
				s += nStr1[d % 10];
				break;
		}
		return (s);
	}
	function GetcMon(m) {
		if (m == 1) return '正';
		if (m == 11) return '冬';
		if (m == 12) return '腊';
		return nStr1[m];
	}
	function getlunar() {
		var lObj = new Lunar(nyear, nmonth - 1, nday);
		lmonth = GetcMon(lObj.month);
		lday = GetcDay(lObj.day);
		lleap = lObj.isLeap;
		if (lleap == 1) {
			lmonth = "闰" + lmonth;
		}
	}
	//农历函数结束
	Draw();
	return returnVal;
}
/**获取农历 end*/

/**获取节气 start*/
function getjq(date, type = 'is') {
	let temp = new Date(date);
	let yyyy = temp.getFullYear();
	let mm = temp.getMonth();
	let dd = temp.getDate();

	var sTermInfo = new Array(0, 21208, 42467, 63836, 85337, 107014, 128867, 150921, 173149, 195551, 218072, 240693, 263343, 285989, 308563, 331033, 353350, 375494, 397447, 419210, 440795, 462224, 483532, 504758);
	var solarTerm = new Array("小寒", "大寒", "立春", "雨水", "惊蛰", "春分", "清明", "谷雨", "立夏", "小满", "芒种", "夏至", "小暑", "大暑", "立秋", "处暑", "白露", "秋分", "寒露", "霜降", "立冬", "小雪", "大雪", "冬至");
	var solarTerms = "";
	//　　此方法是获取该日期是否为某节气
	function isjq() {
		var tmp1 = new Date((31556925974.7 * (yyyy - 1900) + sTermInfo[mm * 2 + 1] * 60000) + Date.UTC(1900, 0, 6, 2, 5));
		var tmp2 = tmp1.getUTCDate();
		if (tmp2 == dd) solarTerms = solarTerm[mm * 2 + 1];
		tmp1 = new Date((31556925974.7 * (yyyy - 1900) + sTermInfo[mm * 2] * 60000) + Date.UTC(1900, 0, 6, 2, 5));
		tmp2 = tmp1.getUTCDate();
		if (tmp2 == dd) solarTerms = solarTerm[mm * 2];
		return solarTerms
	}
	let jqFlag = isjq();

	//　　此方法可以获取该日期处于某节气
	while (solarTerms == "") {
		isjq();
		if (dd > 1) {
			dd = dd - 1;
		} else {
			mm = mm - 1;
			if (mm < 0) {
				yyyy = yyyy - 1; mm = 11;
			}
			dd = 31;
		}
	}
	switch (type) {
		case 'in':
			return solarTerms
		default:
			return jqFlag
	}
}
/**获取节气 end*/

function getDayName(date) {
	let returnVal = "";
	let jq = {
		"小寒": "小寒",
		"大寒": "大寒",
		"立春": "立春",
		"雨水": "雨水",
		"惊蛰": "惊蛰",
		"春分": "春分",
		"清明": "清明",
		"谷雨": "谷雨",
		"立夏": "立夏",
		"小满": "小满",
		"芒种": "芒种",
		"夏至": "夏至",
		"小暑": "小暑",
		"大暑": "大暑",
		"立秋": "立秋",
		"处暑": "处暑",
		"白露": "白露",
		"秋分": "秋分",
		"寒露": "寒露",
		"霜降": "霜降",
		"立冬": "立冬",
		"小雪": "小雪",
		"大雪": "大雪",
		"冬至": "冬至",
	}
	let yinFestival = {
		"正月初一": "春节",
		"正月十五": "元宵节",
		"二月初二": "龙抬头",
		"二月初二": "花朝节",
		"五月初五": "端午节",
		"七月初七": "七夕节",
		"七月十五": "中元节",
		"八月十五": "中秋节",
		"九月初九": "重阳节",
		"十月初一": "寒衣节",
		"腊月初八": "腊八节",
		"腊月廿三": "小年",
		"腊月三十": "除夕",


		"04-04": "寒食节",
		"04-05": "清明节",
	}
	let yangFestival = {
		"01-01": "元旦节",
		"02-14": "情人节",
		"03-08": "妇女节",
		"03-12": "植树节",
		"05-01": "劳动节",
		"05-04": "青年节",
		"06-01": "儿童节",
		"08-01": "建军节",
		"09-10": "教师节",
		"10-01": "国庆节",
		"12-24": "平安夜",
		"12-25": "圣诞节",
	}

	// 05-第二个星期日 母亲节
	// 06-第三个星期日 父亲节
	// 11-第四个星期四 感恩节
	let festival = { ...jq, ...yinFestival, ...yangFestival }
	if (getjq(date)) {
		returnVal = festival[getjq(date)];
	} else {
		let temp = new Date(date);
		let field = `${String(temp.getMonth() + 1).padStart(2, '0')}-${String(temp.getDate()).padStart(2, '0')}`
		let field2 = getLunar(date);
		returnVal = festival[field] ? festival[field] : festival[field2] ? festival[field2] : field2.slice(-2) == '初一' ? field2.slice(0, -2) : field2.slice(-2);
	}
	return returnVal;
}

exports.getDayName = getDayName;
exports.getjq = getjq;
exports.getLunar = getLunar;